#pragma once

#include <Eigen/Dense>

namespace  ldl_eigen
{
class HiddenLayer
{
public:
    void forward(const Eigen::MatrixXf &input, Eigen::MatrixXf &output);
    Eigen::MatrixXf& backward(const Eigen::MatrixXf &output_gradient);

    Eigen::MatrixXf& output();
    void set_input(const Eigen::MatrixXf& input);
    Eigen::MatrixXf& input_gradient();
    void set_output_gradient(const Eigen::MatrixXf& gradient);

    virtual void forward() = 0;
    virtual void backward() = 0;
    virtual void update(){};
protected:
    const Eigen::MatrixXf *m_ptr_input{};
    Eigen::MatrixXf m_output{};
    Eigen::MatrixXf m_input_gradient{};
    const Eigen::MatrixXf *m_ptr_output_gradient{};
};
}
